// 由于不仅仅是Home页面用到了TypeNav组件，搜索的页面也用到了TypeNav，因此需要注册成全局组件
// 所以后面这个文件要放在components成为全局组件
import store from "@/store";
import Vue from "vue";
import VueRouter from "vue-router";
import routes from "./routes";
// 这个是注册路由
Vue.use(VueRouter);
const originPush = VueRouter.prototype.push; //先将之前的push方法存储到一个变量当中
const originReplace = VueRouter.prototype.replace; //将之前的replace存储到一个变量当中
// 在原型上修改push方法
VueRouter.prototype.push = function (location, okCallBack, errCallBack) {
  if (okCallBack === undefined && errCallBack === undefined) {
    // 当判断成立的时候，执行到这里的时候，表示没有传递这两个参数
    originPush.call(this, location).catch(() => {}); //统一处理报错的问题
  } else {
    originPush.call(this, location, okCallBack, errCallBack);
  }
};
//在原型上修改push方法
VueRouter.prototype.replace = function (location, okCallBack, errCallBack) {
  if (okCallBack === undefined && errCallBack === undefined) {
    originReplace.call(this, location).catch(() => {});
  } else {
    originReplace.call(this, okCallBack, errCallBack);
  }
};

// 创建实例对象
const router = new VueRouter({
  mode: "history",
  routes,
  scrollBehavior(to, from, savedPosition) {
    // console.log(to,from,savedPosition)
    // to 要跳转到哪个页面
    // from : 从哪个页面跳转过来
    // savedPosition: 保存之前页面的位置
    if (savedPosition) {
      return savedPosition;
    } else {
      return { x: 0, y: 0 };
    }
  },
});

//准备一个白名单，这是不需要验证的，是随时可以跳转访问的
const whiteList = [
  "home",
  "search",
  "detail",
  "shopcart",
  "addCartSuccess",
  "login",
  "register",
];
// 5. 添加路由守卫  给router对象添加路由全局前置守卫
// 执行时机: 只要有路径跳转就会走这个全局前置守卫
router.beforeEach((to, from, next) => {
  // to表示要跳转到的页面 login register home  detail  shopcart
  // from 来自于某个页面
  // console.log(to,from)
  if (whiteList.includes(to.name) || store.state.user.userInfo.token) {
    next(); // 放行
    return; // 不要向下执行了
  }
  //下面的就是没有登录的情况跳转到login登录界面，同时把现在要跳转的路径传过去，方便登录之后直接可以跳转到之前的页面
  next({
    name: "login",
    query: {
      redirect: to.path, // 记录一下之前要访问的路径 是为了提高用户体验
    },
  });
});

// 导出当前对象
export default router;
